﻿using Carlife.Inf;
using ICarlifeRespository;
using Dapper;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CarlifeRespository
{
    public class BasePespository<T> : IBasePespository<T> where T : class, new()
    {
        private readonly CarlifeDbcontext db;
        private readonly IDbConnection dbConnection;
        public BasePespository(CarlifeDbcontext db,DapperHelper dapperHelper)
        {
            this.db = db;
            dbConnection=dapperHelper.GetDbConnection();
        }
        #region EF
        public void Add(T entity)
        {
           db.Set<T>().Add(entity);
        }
        public void AddRange(List<T> enitity)
        {
            db.Set<T>().AddRange(enitity);
        }
        public void Delete(T entity)
        {
            db.Set<T>().Remove(entity);
        }
        public List<T> GetAll()
        {
            return db.Set<T>().ToList();
        }
        /// <summary>
        /// 根据主建查询
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public T GetById(int id)
        {
#pragma warning disable CS8603 // 可能返回 null 引用。
            return db.Set<T>().Find(id);
#pragma warning restore CS8603 // 可能返回 null 引用。
        }
        public void Update(T entity)
        {
            db.Set<T>().Update(entity);
        }
        #endregion
        #region Dapper
#pragma warning disable CS8625 // 无法将 null 字面量转换为非 null 的引用类型。
        public async Task<int> Execute(string sql, object param, IDbTransaction transaction = null)
#pragma warning restore CS8625 // 无法将 null 字面量转换为非 null 的引用类型。
        {
            return await dbConnection.ExecuteAsync(sql, param,transaction);
        }
#pragma warning disable CS8625 // 无法将 null 字面量转换为非 null 的引用类型。
        public async Task<List<T>> Query(string sql, object param = null)
#pragma warning restore CS8625 // 无法将 null 字面量转换为非 null 的引用类型。
        {
            var result = (await dbConnection.QueryAsync<T>(sql, param)).ToList();
            return result;
        }

        public async Task<List<T>> Query(string sql, object param, CommandType commandType)
        {
            var result = (await dbConnection.QueryAsync<T>(sql, param, commandType: commandType)).ToList() ;
            return result;
        }
        #endregion
        //dapper的增删改操作（返回受影响行数）

    }
}
